#include "EventLoopThread.h"
#include "EventLoop.h"

EventLoopThread::EventLoopThread(const ThreadInitCallback &cb, const std::string &name)
    : loop_(nullptr)
    , exiting_(false)
    , thread_(std::bind(&EventLoopThread::threadFunc, this), name)
    , mutex_()
    , cond_()
    , callback_(cb)
{
    // 如果没有提供 cb 参数，则 cb 将使用 std::function<void(EventLoop*)> 的默认构造函数进行初始化
    // 默认构造的结果是一个空的 std::function 对象，也就是说它不会绑定到任何实际的函数、lambda 表达式或可调用对象上
}

EventLoopThread::~EventLoopThread()
{
    exiting_ = true;
    if(loop_ != nullptr)
    {
        loop_->quit();
        thread_.join();  // 等待底层的子线程结束
    }
}

EventLoop* EventLoopThread::startLoop()  // 返回新线程中创建的loop对象的地址
{
    thread_.start();  // 启动底层线程，开一个新线程执行threadFunc

    EventLoop* loop = nullptr;
    {
        std::unique_lock<std::mutex> lock(mutex_);
        while (loop_ == nullptr)
        {
            cond_.wait(lock);  // EventLoopThread::threadFunc()里notify
        }
        loop = loop_;
    }
    return loop;
}

// 下面这个方法是在单独的新线程里面运行的
void EventLoopThread::threadFunc()
{
    EventLoop loop;  // 创建一个独立的eventLoop，和上面的线程是一一对应的 -- one loop per thread

    if(callback_)  // 初始化回调
    {
        callback_(&loop);  // 对新线程中的loop初始化
    }

    {
        std::unique_lock<std::mutex> lock(mutex_);
        loop_ = &loop;
        cond_.notify_one();
    }

    loop.loop();  // EventLoop的loop函数 → Poller.poll
    // loop.loop()里是一个循环，继续往下执行就是退出了，服务器程序要关闭了不进行事件循环了
    std::unique_lock<std::mutex> lock(mutex_);
    loop_ = nullptr;
}